package com.niit.mall.common.domain.dto;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.niit.mall.common.utils.BeanUtils;
import com.niit.mall.common.utils.CollUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.List;

/**
 * 分页数据传输对象类，用于承载分页信息及泛型列表数据。
 *
 * @param <T> 泛型参数，表示列表中数据的类型
 * @author ChuXuan
 * @date 2025/06/08
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageDTO<T> {
	/**
	 * 总数
	 */
	private Long total;
	/**
	 * 页数
	 */
	private Long pages;
	/**
	 * 包含泛型元素T的列表。
	 */
	private List<T> list;
	
	/**
	 * 将Page<PO>类型的数据转换为PageDTO<VO>类型的数据。
	 *
	 * @param <PO>  原始数据类型
	 * @param <VO>  转换后的数据类型
	 * @param po    Page<PO>类型的分页数据
	 * @param clazz VO的类型类对象
	 * @return PageDTO<VO>类型的分页数据传输对象
	 */
	public static <PO,VO> PageDTO<VO> of(Page<PO> po,Class<VO> clazz){
		PageDTO<VO> dto = new PageDTO<>();
		// 总条数
		dto.setTotal(po.getTotal());
		// 总页数
		dto.setPages(po.getPages());
		// 获取当前页
		List<PO> list = po.getRecords();

		if(CollUtil.isEmpty(list)) {
			dto.setList(Collections.emptyList());
			return dto;
		}
		//
		dto.setList(BeanUtils.copyList(list,clazz));
		return dto;
	}
	
	/**
	 * 创建一个空的分页数据传输对象（DTO）
	 *
	 * @param <T>   分页数据的类型
	 * @param total 数据总量
	 * @param pages 总页数
	 * @return 一个包含指定总量和页数，但数据列表为空的PageDTO对象
	 */
	public static <T> PageDTO<T> empty(Long total, Long pages) {
		return new PageDTO<>(total, pages, CollUtils.emptyList());
	}
	
	/**
	 * 创建一个空的PageDTO对象
	 *
	 * @param <T>  PageDTO中数据的类型
	 * @param page 用于提取分页信息的Page对象
	 * @return 一个总页数为page.getTotal()，当前页码为page.getPages()，且数据列表为空的PageDTO对象
	 */
	public static <T> PageDTO<T> empty(Page<?> page) {
		return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList());
	}
	
}
